home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / telecom / 96 / c / signal.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-01-15  |  5.1 KB  |  121 lines

  1. /* SIGNAL.C
  2.  * From: RDROYA01@ULKYVX.BITNET (Robert Royar)
  3.  * File to replace the nonworking Alcyon (GEMLIB) signal function.
  4.  * Note the additional functions available.
  5.  * Returns -1 on error, 0 on success, and 1 for an ignored signal.
  6.  */
  7.  
  8. #include <osbind.h>
  9. /* Here are the defs if your kit didn't have signal.h */
  10. #ifdef  SIG_NO_INC
  11. #define NSIG    15                      /* 15 simulated signals             */
  12. #define SIGHUP   1                      /* Hangup                           */
  13. #define SIGINT   2                      /* Interrupt (^C)                   */
  14. #define SIGQUIT  3                      /* Quit signal                      */
  15. #define SIGILL   4                      /* Illegal Instruction trap         */
  16. #define SIGTRAP  5                      /* Trace Trap                       */
  17. #define SIGIOT   6                      /* IOT instruction (on PDP-11)      */
  18. #define SIGEMT   7                      /* EMT instruction (TRAP on 68k)    */
  19. #define SIGFPE   8                      /* Floating point exception         */
  20. #define SIGKILL  9                      /* Kill (cannot be intercepted)     */
  21. #define SIGBUS  10                      /* BUSERR (non-ex memory reference) */
  22. #define SIGSEGV 11                      /* Segmentation (MMU) violation     */
  23. #define SIGSYS  12                      /* Bad argument to system call      */
  24. #define SIGPIPE 13                      /* Write on a broken pipe           */
  25. #define SIGALRM 14                      /* Alarm clock (what a name!)       */
  26. #define SIGTERM 15                      /* Software termination signal      */
  27.                                         /************************************/
  28. #define BADSIG  (-1)                    /* Error return                     */
  29. #define SIG_DFL (0)                     /* Default action on signal call    */
  30. #define SIG_IGN (1)                     /* Ignore                           */
  31.                                         /************************************/
  32. #else
  33. #include <signal.h>
  34. #endif
  35.  
  36. #define NULL    0
  37. #define TIM_INT 0x100
  38. #define ERR_INT 0x101
  39. #define CTRL_C  0x102
  40. #define BUSERR  2       /* nonexistent memory */
  41. #define ADDRERR 3       /* allignment violation */
  42. #define ZERO_D  5       /* division by zero */
  43. #define CHK     6       /* CHK interrupt */
  44. #define TRAPV   7       /* overflow */
  45. #define TRAP_0  32      /* TRAP #0 vector */
  46. #define TRAP_3  35      /* TRAP #3 vector */
  47. #define TRAP_12 44      /* TRAP #12 vector */
  48. #define TRAP_15 47      /* TRAP #15 vector */
  49.  
  50. signal(sig, func)
  51. register int sig;
  52. register long func;
  53. {
  54.         int signum[16];
  55.         register int *sigptr;
  56.         register int i;
  57.  
  58.         sigptr = &signum[0];
  59.         if (sig < 1 || sig > NSIG)
  60.                 return(BADSIG);
  61.         switch(sig)
  62.                 {
  63.                 case SIGHUP:
  64.                         Mfpint(1,func);
  65.                         return(SIG_DFL);
  66.                 case SIGINT:
  67.                 case SIGQUIT:
  68.                 case SIGTERM:
  69.                         /* WARNING: may close all open files */
  70.                         *sigptr++ = CTRL_C;;
  71.                         *sigptr = NULL;
  72.                         break;
  73.                 case SIGILL:
  74.                         *sigptr++ = 4; /* Illegal */
  75.                         *sigptr++ = 8; /* Priv. */
  76.                         *sigptr++ = 10; /* Line A !!WARNING!! */
  77.                         *sigptr++ = 11; /* Line F !!WARNING!! */
  78.                         *sigptr = NULL;
  79.                         break;
  80.                 case SIGTRAP:
  81.                         *sigptr++ = 9;  /* Trace */
  82.                         *sigptr = NULL;
  83.                         break;
  84.                 case SIGIOT:
  85.                 case SIGEMT:
  86.                         *sigptr++ = TRAP_0;     /* TRAP 0 */
  87.                         for (i=TRAP_3;i<=TRAP_12;*sigptr++ = i,++i)
  88.                                 ;
  89.                         *sigptr++ = TRAP_15;
  90.                         *sigptr = NULL;
  91.                         break;
  92.                 case SIGFPE:
  93.                         for (i=ZERO_D; i<=TRAPV;*sigptr++ = i,++i)
  94.                                 ;
  95.                         *sigptr = NULL;
  96.                         break;
  97.                 case SIGKILL:   /* ignored on the ST */
  98.                         return(SIG_IGN); /* SIG_IGN = 1 */
  99.                 case SIGBUS:
  100.                         *sigptr++ = BUSERR;
  101.                         *sigptr = NULL;
  102.                         break;
  103.                 case SIGSEGV:
  104.                         *sigptr++ = ADDRERR;
  105.                         *sigptr = NULL;
  106.                         break;
  107.                 case SIGSYS:
  108.                 case SIGPIPE:
  109.                         *sigptr++ = ERR_INT;    /* Is this OK? */
  110.                         *sigptr = NULL;
  111.                         break;
  112.                 case SIGALRM:
  113.                         *sigptr++ = TIM_INT;
  114.                         *sigptr = NULL;
  115.                         break;
  116.                 }
  117.         for(sigptr = &signum[0]; *sigptr != NULL; sigptr++)
  118.                 Setexc(*sigptr,func);
  119.         return(SIG_DFL);
  120. }
  121.